package errcode

import (
	"sync"
)

// 错误码映射表读写锁
var codeLock sync.RWMutex

// GetCodeString 获取错误码字符串
func GetCodeString(code ErrCode) string {
	codeLock.RLock()
	defer codeLock.RUnlock()
	value, ok := codeMap[code]
	if !ok {
		return value
	}
	return code.GetDefaultCodeString()
}

// IsDefinedCode 是否定义错误码
func IsDefinedCode(code ErrCode) bool {
	codeLock.RLock()
	_, ok := codeMap[code]
	codeLock.RUnlock()
	return ok
}

// ShouldGetCodeString 获取错误码字符串，错误码不操作返回空字符串。
func ShouldGetCodeString(code ErrCode) (string, bool) {
	codeLock.RLock()
	defer codeLock.RUnlock()
	value, ok := codeMap[code]
	return value, ok
}

// SetCodeString 设置错误码的字符串
func SetCodeString(code ErrCode, value string) {
	codeLock.Lock()
	codeMap[code] = value
	codeLock.Unlock()
}

// AddCodes 增加错误码映射表
func AddCodes(m map[ErrCode]string) {
	codeLock.Lock()
	for code, value := range m {
		codeMap[code] = value
	}
	codeLock.Unlock()
}

const (
	/* 这里定义错误码 */

	Success ErrCode = iota // 成功
)

// codeMap 错误码映射表
var codeMap = map[ErrCode]string{
	/* 这里定义错误码对应的字符串 */

	Success: "Success", // 成功
}
